CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ด๋ฆ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ํด๊ฒฐํ์ฌ, ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ๋ฐ์ํ ๋์์ธ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ด๋ฆ ์ถฉ๋: ์ปจํ ์ด๋ ์ฐธ์กฐ ์ถฉ๋ ํด๊ฒฐ
CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ์ง์ ํ ์๋ฏธ์ ๋ฐ์ํ ๋์์ธ์ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ๋ทฐํฌํธ ํฌ๊ธฐ์ ๋ฐ์ํ๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๋ฌ๋ฆฌ, ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ์ปดํฌ๋ํธ๊ฐ ํฌํจํ๋ ์์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ์ํ๋๋ก ํฉ๋๋ค. ์ด๋ ๋ ๋ชจ๋ํ๋๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ๋ก ์ด์ด์ง๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ํํ ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์์ต๋๋ค: ๋ฐ๋ก ์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ์ถฉ๋์ ์ดํดํ๊ณ , ์ง๋จํ๋ฉฐ, ํด๊ฒฐํ์ฌ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๊ฐ ์์๋๋ก ์๋ํ๋๋ก ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์์ธํ ์์๋ด ๋๋ค.
์ปจํ ์ด๋ ์ฟผ๋ฆฌ ์ด๋ฆ ์ถฉ๋ ์ดํดํ๊ธฐ
์ปจํ
์ด๋ ์ฟผ๋ฆฌ๋ ์ปจํ
์ด๋ ์ปจํ
์คํธ(containing context)๋ก ๋ช
์์ ์ผ๋ก ์ง์ ๋ ํน์ ์์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค. ์ด๋ container-type ์์ฑ๊ณผ ์ ํ์ ์ผ๋ก container-name์ ์ฌ์ฉํ์ฌ ์ค์ ๋ฉ๋๋ค. ์ฌ๋ฌ ์ปจํ
์ด๋ ์์์ ๋์ผํ container-name์ ํ ๋นํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ฟผ๋ฆฌ๊ฐ ์ด๋ค ์ปจํ
์ด๋ ์์๋ฅผ ์ฐธ์กฐํด์ผ ํ๋์ง ๊ฒฐ์ ํด์ผ ํ๋ฉฐ, ๊ทธ ๋์์ ์์ธก ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ์ผ๊ด์ฑ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ ์๋ง์ ์ปดํฌ๋ํธ๊ฐ ์๋ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ ๋ช
๋ช
๊ท์น์ด ๊ฒน์น ์ ์๋ CSS ํ๋ ์์ํฌ๋ก ์์
ํ ๋ ํนํ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค:
.card {
container-type: inline-size;
container-name: card-container;
}
.sidebar {
container-type: inline-size;
container-name: card-container; /* Collision! */
}
@container card-container (min-width: 400px) {
.element-inside {
color: blue;
}
}
์ด ์๋๋ฆฌ์ค์์๋ .card์ .sidebar ๋ชจ๋์ ๋์ผํ ์ปจํ
์ด๋ ์ด๋ฆ์ธ card-container๊ฐ ํ ๋น๋์์ต๋๋ค. ์ปจํ
์ด๋ ์ฟผ๋ฆฌ @container card-container (min-width: 400px)๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ๋, ๋ธ๋ผ์ฐ์ ๋ ๋ฌธ์ ๊ตฌ์กฐ์ ๋ธ๋ผ์ฐ์ ๊ตฌํ์ ๋ฐ๋ผ .card ๋๋ .sidebar์ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ธก ๋ถ๊ฐ๋ฅ์ฑ์ด ๋ฐ๋ก ์ปจํ
์ด๋ ์ด๋ฆ ์ถฉ๋์ ๋ณธ์ง์
๋๋ค.
์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ๋ ์ด์
๋ช ๊ฐ์ง ์์ธ์ด ์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ์์ธ์ด ๋ฉ๋๋ค:
- ๋ช ๋ช ๊ท์น์ ๋ถ์ฌ: ๋ช ํํ๊ณ ์ผ๊ด๋ ๋ช ๋ช ์ ๋ต์ด ์์ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ค์๋ก ๋์ผํ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ: ๋ค๋ฅธ ์ปจํ ์คํธ์์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ ๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ์กฐ์ ํ๋ ๊ฒ์ ์์ด ์ถฉ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ ํนํ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ ๋ ํํฉ๋๋ค.
- CSS ํ๋ ์์ํฌ: ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์์ง๋ง, ๊ธฐ๋ณธ ์ปจํ ์ด๋ ์ด๋ฆ์ด ์ผ๋ฐ์ ์ด์ด์ ์ง์ ์์ฑํ ์ด๋ฆ๊ณผ ๊ฒน์น๋ ๊ฒฝ์ฐ ์ด๋ฆ ์ถฉ๋์ ์ผ์ผํฌ ์๋ ์์ต๋๋ค.
- ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค: ํฌ๊ณ ๋ณต์กํ ํ๋ก์ ํธ์์๋ ๋ชจ๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ถ์ ํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ ธ ์ฐ๋ฐ์ ์ธ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋๋ค.
- ํ ํ์ : ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋์ผํ ํ๋ก์ ํธ์์ ์์ ํ ๋ ์ผ๊ด์ฑ ์๋ ๋ช ๋ช ๋ฐฉ์์ ์ฝ๊ฒ ์ถฉ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋ ์ง๋จํ๊ธฐ
์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ์๋ณํ๋ ๊ฒ์ ๊น๋ค๋ก์ธ ์ ์์ผ๋ฉฐ, ๊ทธ ์ํฅ์ด ์ฆ์ ๋ช ํํ๊ฒ ๋ํ๋์ง ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ง๋จํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ
๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ๋ ๊ณ์ฐ๋ ์คํ์ผ์ ๊ฒ์ฌํ๊ณ ์ด๋ค ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๊ฐ ์ ์ฉ๋๊ณ ์๋์ง ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ ํ๋ฅญํ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ(๋ณดํต F12 ํค๋ฅผ ๋๋ฌ ์ด๊ธฐ)๋ฅผ ์ด๊ณ , ์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ์ํฅ์ ๋ฐ๋ ๊ฒ์ผ๋ก ์์ฌ๋๋ ์์๋ฅผ ์ ํํ ๋ค์ "Computed" ๋๋ "Styles" ํญ์ ๊ฒ์ฌํ์ธ์. ์ด๋ฅผ ํตํด ์ด๋ค ์ปจํ ์ด๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ค ์คํ์ผ์ด ์ ์ฉ๋๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
2. ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ๊ฒ์ฌ๊ธฐ ํ์ฅ ํ๋ก๊ทธ๋จ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ์๊ฐํํ๊ณ ๋๋ฒ๊น ํ๋ ๋ฐ ๋์์ด ๋๋๋ก ํน๋ณํ ์ค๊ณ๋ ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ์ด๋ฌํ ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ข ์ข ์ปจํ ์ด๋ ์์ ๊ฐ์กฐ ํ์, ํ์ฑ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ ํ์, ์ปจํ ์ด๋ ํฌ๊ธฐ ํ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ํ์ฅ ํ๋ก๊ทธ๋จ ์คํ ์ด์์ "CSS Container Query Inspector"๋ฅผ ๊ฒ์ํด ๋ณด์ธ์.
3. ์๋ ์ฝ๋ ๊ฒํ
๋๋ก๋ ์ถฉ๋์ ์ฐพ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋จ์ํ CSS ์ฝ๋๋ฅผ ์ฝ๊ณ ๋์ผํ container-name์ด ์ฌ๋ฌ ์์์์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋ ๊ฒ์
๋๋ค. ์ด๋ ์ง๋ฃจํ ์ ์์ง๋ง ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์ข
์ข
ํ์ํฉ๋๋ค.
4. ์๋ํ๋ ๋ฆฐํฐ ๋ฐ ์ ์ ๋ถ์
์ ์ฌ์ ์ธ ์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ์๋์ผ๋ก ๊ฐ์งํ๊ธฐ ์ํด CSS ๋ฆฐํฐ๋ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๋ฌํ ๋๊ตฌ๋ ์ฝ๋์์ ์ค๋ณต๋ ์ด๋ฆ์ ์ค์บํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๋ํด ๊ฒฝ๊ณ ํ ์ ์์ต๋๋ค. Stylelint๋ ํน์ ๋ช ๋ช ๊ท์น์ ๊ฐ์ ํ๊ณ ์ถฉ๋์ ๊ฐ์งํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ ์ธ๊ธฐ ์๊ณ ๊ฐ๋ ฅํ CSS ๋ฆฐํฐ์ ๋๋ค.
์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋ ํด๊ฒฐ: ์ ๋ต ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ํ์ธํ๋ค๋ฉด ๋ค์ ๋จ๊ณ๋ ํด๊ฒฐํ๋ ๊ฒ์ ๋๋ค. ๋ค์์ ๋ฐ๋ฅผ ์ ์๋ ๋ช ๊ฐ์ง ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค:
1. ๊ณ ์ ํ ๋ช ๋ช ๊ท์น ์ฌ์ฉ
๊ฐ์ฅ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ปจํ ์ด๋ ์ด๋ฆ์ ๋ํด ์ผ๊ด๋๊ณ ๊ณ ์ ํ ๋ช ๋ช ๊ท์น์ ์ฑํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฐ๋ฐ์ ์ธ ์ฌ์ฌ์ฉ์ ๋ฐฉ์งํ๊ณ ์ฝ๋๋ฅผ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํด ๋ณด์ธ์:
- ์ปดํฌ๋ํธ๋ณ ์ด๋ฆ: ์ํ ์ปดํฌ๋ํธ์ ํนํ๋ ์ปจํ
์ด๋ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด,
card-container๋์ ์ ํ ์นด๋ ์ปดํฌ๋ํธ์๋product-card-container๋ฅผ, ๊ธฐ์ฌ ์นด๋ ์ปดํฌ๋ํธ์๋article-card-container๋ฅผ ์ฌ์ฉํ์ธ์. - BEM (Block, Element, Modifier): BEM ๋ฐฉ๋ฒ๋ก ์ ์ปจํ
์ด๋ ์ด๋ฆ์๋ ํ์ฅ๋ ์ ์์ต๋๋ค. ๋ธ๋ก ์ด๋ฆ์ ์ปจํ
์ด๋ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด,
.product๋ผ๋ ๋ธ๋ก์ด ์๋ค๋ฉด ์ปจํ ์ด๋ ์ด๋ฆ์product__container๊ฐ ๋ ์ ์์ต๋๋ค. - ๋ค์์คํ์ด์ค: ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ จ๋ ์ปจํ
์ด๋ ์ด๋ฆ์ ๊ทธ๋ฃนํํ์ธ์. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์
์ ๊ด๋ฆฌ์ ์น์
๋ด ์ปจํ
์ด๋ ์ด๋ฆ์๋
admin-๊ณผ ๊ฐ์ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ํ๋ก์ ํธ๋ณ ์ ๋์ฌ: ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์์ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ๋ชจ๋ ์ปจํ
์ด๋ ์ด๋ฆ์ ํ๋ก์ ํธ๋ณ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํ์ธ์. ์๋ฅผ ๋ค์ด, ํ๋ก์ ํธ ์ด๋ฆ์ด "Acme"๋ผ๋ฉด
acme-์ ๋์ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ๋ณ ์ด๋ฆ์ ์ฌ์ฉํ ์์:
.product-card {
container-type: inline-size;
container-name: product-card-container;
}
.article-card {
container-type: inline-size;
container-name: article-card-container;
}
@container product-card-container (min-width: 400px) {
.element-inside {
color: blue;
}
}
2. CSS ๋ชจ๋
CSS ๋ชจ๋์ CSS ํด๋์ค์ ์ปจํ ์ด๋ ์ด๋ฆ์ ํน์ ์ปดํฌ๋ํธ๋ก ์๋ ์ค์ฝํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๊ณ ์ ํ ๊ฒฉ๋ฆฌ๋ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํ์ฌ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค. CSS ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ์ปจํ ์ด๋ ์ด๋ฆ์ด ์๋์ผ๋ก ์์ฑ๋์ด ๊ณ ์ ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
CSS ๋ชจ๋์ ์ฌ์ฉํ ์์ (Webpack๊ณผ ๊ฐ์ CSS ๋ชจ๋์ ์ง์ํ๋ ๋ฒ๋ค๋ฌ๋ฅผ ๊ฐ์ ):
/* ProductCard.module.css */
.container {
container-type: inline-size;
container-name: productCardContainer;
}
/* ArticleCard.module.css */
.container {
container-type: inline-size;
container-name: articleCardContainer;
}
JavaScript ์ปดํฌ๋ํธ์์:
import styles from './ProductCard.module.css';
function ProductCard() {
return (
<div className={styles.container}>
{/* ... */}
</div>
);
}
๋ฒ๋ค๋ฌ๋ container-name์ ๊ณ ์ ์๋ณ์๋ก ์๋ ๋ณํํ์ฌ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
3. Shadow DOM
Shadow DOM์ ์ปค์คํ ์๋ฆฌ๋จผํธ ๋ด์ ์คํ์ผ์ ์บก์ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ Shadow DOM ๋ด์ ์ ์๋ ์คํ์ผ์ด ๋ฌธ์์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌ๋์ด ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ปค์คํ ์๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Shadow DOM์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ค์ฝํํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
Shadow DOM์ ์ฌ์ฉํ ์์:
class MyComponent extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
<style>
.container {
container-type: inline-size;
container-name: myComponentContainer;
}
@container myComponentContainer (min-width: 400px) {
.element-inside {
color: blue;
}
}
</style>
<div class="container">
<slot></slot>
</div>
`;
}
}
customElements.define('my-component', MyComponent);
my-component์ Shadow DOM ๋ด์ ์ ์๋ ์คํ์ผ๊ณผ ์ปจํ
์ด๋ ์ด๋ฆ์ ๊ฒฉ๋ฆฌ๋์ด ๋ฌธ์์ ๋ค๋ฅธ ๊ณณ์ ์ ์๋ ์คํ์ผ๊ณผ ์ถฉ๋ํ์ง ์์ต๋๋ค.
4. ์ผ๋ฐ์ ์ธ ์ด๋ฆ ํผํ๊ธฐ
container, wrapper ๋๋ box์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ปจํ
์ด๋ ์ด๋ฆ ์ฌ์ฉ์ ํผํ์ธ์. ์ด๋ฌํ ์ด๋ฆ์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ถฉ๋ ์ํ์ ์ฆ๊ฐ์ํต๋๋ค. ๋์ , ์ปจํ
์ด๋์ ๋ชฉ์ ์ ๋ฐ์ํ๋ ๋ ์ค๋ช
์ ์ด๊ณ ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์.
5. ํ๋ก์ ํธ ๊ฐ ์ผ๊ด๋ ๋ช ๋ช
์ฌ๋ฌ ํ๋ก์ ํธ์์ ์์ ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ๋ก์ ํธ์ ๊ฑธ์ณ ์ผ๊ด๋ ๋ช ๋ช ๊ท์น์ ์๋ฆฝํ๋ ค๊ณ ๋ ธ๋ ฅํ์ธ์. ์ด๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ค์๋ก ๋์ผํ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ช ๋ช ๊ท์น ๋ฐ ๊ธฐํ CSS ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์ฝํ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
6. ์ฝ๋ ๋ฆฌ๋ทฐ
์ ๊ธฐ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ ์ ์ฌ์ ์ธ ์ปจํ
์ด๋ ์ด๋ฆ ์ถฉ๋์ด ๋ฌธ์ ๊ฐ ๋๊ธฐ ์ ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ํ์๋ค์ด ์๋ก์ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๊ณ ๋์ผํ container-name์ด ์ฌ๋ฌ ์์์์ ์ฌ์ฉ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋๋ก ์ฅ๋ คํ์ธ์.
7. ๋ฌธ์ํ
๋ช ๋ช ๊ท์น ๋ฐ ๊ธฐํ CSS ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ชจ๋ ํ์์ด ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ ์ค์ ์์น์ ๋ฌธ์ํํ์ธ์. ์ด๋ ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ์ง์นจ์ ๋ฐ๋ฅด๊ณ ์๋ก์ด ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ์ ์ฝ๋ฉ ํ์ค์ ์ ์ํ๊ฒ ๋ฐฐ์ธ ์ ์๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
8. ๋ช ์์ฑ์ ์ฌ์ฉํ์ฌ ์คํ์ผ ๋ฎ์ด์ฐ๊ธฐ (์ฃผ์ํด์ ์ฌ์ฉ)
๊ฒฝ์ฐ์ ๋ฐ๋ผ CSS ๋ช ์์ฑ์ ์ฌ์ฉํ์ฌ ์ถฉ๋ํ๋ ์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ์ํด ์ ์ฉ๋ ์คํ์ผ์ ๋ฎ์ด์จ์ ์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ CSS๋ฅผ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ๊ทผ๋ณธ์ ์ธ ์ด๋ฆ ์ถฉ๋์ ์ง์ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
์์:
.card {
container-type: inline-size;
container-name: card-container;
}
.sidebar {
container-type: inline-size;
container-name: card-container; /* Collision! */
}
@container card-container (min-width: 400px) {
.element-inside {
color: blue; /* Potentially applied based on either .card or .sidebar */
}
}
/* Override styles specifically for .element-inside within .card */
.card .element-inside {
color: green !important; /* Higher specificity overrides the previous rule */
}
!important ์ฌ์ฉ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ง๋ง, ์๋ณธ CSS๋ฅผ ์ฝ๊ฒ ์์ ํ ์ ์๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ๋ฅผ ๋ค๋ฃฐ ๋์ ๊ฐ์ ํน์ ์ํฉ์์๋ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ตญ์ ํ(i18n) ๊ณ ๋ ค์ฌํญ
๊ตญ์ ์ ์ธ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ์น์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ ๋, ์ปจํ ์ด๋ ์ด๋ฆ์ด ๋ค๋ฅธ ์ธ์ด ๋ฐ ์ฐ๊ธฐ ๋ฐฉํฅ์ ์ํด ์ด๋ป๊ฒ ์ํฅ์ ๋ฐ์ ์ ์๋์ง ๊ณ ๋ คํ์ธ์. ์๋ฅผ ๋ค์ด, ์์ด ๋จ์ด๊ฐ ํฌํจ๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ธ์ด์์ ์๋ํ์ง ์์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์๋๋ก ํ์ธํด์ผ ํฉ๋๋ค. ๋ํ ์ผ๋ถ ์ธ์ด๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL)์ผ๋ก ์์ฑ๋์ด ์ปดํฌ๋ํธ์ ๋ ์ด์์๊ณผ ์คํ์ผ์ ์ํฅ์ ์ค ์ ์๋ค๋ ์ ์ ์ธ์งํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ์ ๋ต์ ๊ณ ๋ คํด ๋ณด์ธ์:
- ์ธ์ด ์ค๋ฆฝ์ ์ธ ์ปจํ ์ด๋ ์ด๋ฆ ์ฌ์ฉ: ๊ฐ๋ฅํ๋ค๋ฉด ํน์ ์ธ์ด์ ์ฝ๋งค์ด์ง ์๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๋ฌธํ๊ถ์์ ์ฝ๊ฒ ์ดํดํ ์ ์๋ ์ซ์ ์๋ณ์๋ ์ฝ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ก์ผ์ผ์ ๋ฐ๋ผ ์ปจํ ์ด๋ ์ด๋ฆ ์กฐ์ : ํ์งํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ์ปจํ ์ด๋ ์ด๋ฆ์ ์กฐ์ ํ์ธ์. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ์ธ์ด ๋๋ ์ง์ญ์ ๋ํด ๋ค๋ฅธ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋
ผ๋ฆฌ์ ์์ฑ ์ฌ์ฉ:
left๋ฐright์ ๊ฐ์ ๋ฌผ๋ฆฌ์ ์์ฑ ๋์start๋ฐend์ ๊ฐ์ ๋ ผ๋ฆฌ์ ์์ฑ์ ์ฌ์ฉํ์ธ์. ์ด๋ฌํ ์์ฑ์ ํ์ฌ ๋ก์ผ์ผ์ ์ฐ๊ธฐ ๋ฐฉํฅ์ ์๋์ผ๋ก ์ ์ํฉ๋๋ค.
์ ๊ทผ์ฑ(a11y) ๊ณ ๋ ค์ฌํญ
์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ์ ๊ทผ์ฑ์๋ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ผ ๋ฐ์ํ ๋์์ธ์ด ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ์ธ์:
- ์๋งจํฑ HTML ์ฌ์ฉ: ์๋งจํฑ HTML ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์ ๋ช ํํ๊ณ ์๋ฏธ ์๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ์ธ์. ์ด๋ ๋ณด์กฐ ๊ธฐ์ ์ด ๊ฐ ์์์ ๋ชฉ์ ์ ์ดํดํ๊ณ ์ฌ์ฉ์์๊ฒ ์ ์ ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ด๋ฏธ์ง์ ๋ํ ๋์ฒด ํ ์คํธ ์ ๊ณต: ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์๋ ์ฌ์ฉ์๋ฅผ ์ํด ํญ์ ์ด๋ฏธ์ง์ ๋ด์ฉ์ ์ค๋ช ํ๋ ๋์ฒด ํ ์คํธ๋ฅผ ์ ๊ณตํ์ธ์.
- ์ถฉ๋ถํ ์์ ๋๋น ๋ณด์ฅ: ํ ์คํธ์ ๋ฐฐ๊ฒฝ ๊ฐ์ ์์ ๋๋น๊ฐ ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ์ ์ถฉ์กฑํ ๋งํผ ์ถฉ๋ถํ์ง ํ์ธํ์ธ์.
- ๋ณด์กฐ ๊ธฐ์ ๋ก ํ ์คํธ: ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๊ฐ์ ๋ณด์กฐ ๊ธฐ์ ๋ก ์น์ฌ์ดํธ๋ฅผ ํ ์คํธํ์ฌ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์.
๊ฒฐ๋ก
CSS ์ปจํ ์ด๋ ์ฟผ๋ฆฌ๋ ๋ฐ์ํ ์น ๊ฐ๋ฐ ํดํท์ ๊ท์คํ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค. ์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ์ดํดํ๊ณ ํด๊ฒฐํจ์ผ๋ก์จ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ์ง์ ์ผ๋ก ๋ฐ์ํ์ธ UI ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๋ช ํํ ๋ช ๋ช ๊ท์น์ ๊ตฌํํ๊ณ , CSS ๋ชจ๋์ด๋ Shadow DOM์ ํ์ฉํ๋ฉฐ, ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํฉํ๋ ๊ฒ์ด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ณ ํด๊ฒฐํ๋ ํต์ฌ์ ๋๋ค. ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ํฌ์ฉ์ ์ธ ๋์์ธ์ ๋ง๋ค๊ธฐ ์ํด ๊ตญ์ ํ์ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด๋ฌํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ปจํ ์ด๋ ์ฟผ๋ฆฌ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ํ์ฉํ๊ณ ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ค์ฒ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ:
- ๊ธฐ์กด CSS ์ฝ๋๋ฒ ์ด์ค์์ ์ ์ฌ์ ์ธ ์ปจํ ์ด๋ ์ด๋ฆ ์ถฉ๋์ ๊ฐ์ฌํ๋ ๊ฒ์ผ๋ก ์์ํ์ธ์.
- ๋ชจ๋ ์ปจํ ์ด๋ ์ด๋ฆ์ ๋ํด ๊ณ ์ ํ๊ณ ์ผ๊ด๋ ๋ช ๋ช ๊ท์น์ ๊ตฌํํ์ธ์.
- ์ปจํ ์ด๋ ์ด๋ฆ์ ์ค์ฝํํ๊ธฐ ์ํด CSS ๋ชจ๋์ด๋ Shadow DOM ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
- ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํฉํ์ฌ ์ ์ฌ์ ์ธ ์ถฉ๋์ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ์ธ์.
- ๋ช ๋ช ๊ท์น ๋ฐ CSS ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ ์์น์ ๋ฌธ์ํํ์ธ์.
- ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ณด์กฐ ๊ธฐ์ ๋ก ๋์์ธ์ ํ ์คํธํ์ธ์.